# The values used here are copied from CSAILVision/sceneparsing:
# https://github.com/CSAILVision/sceneparsing

import filelock
import os

from chainer.dataset import download
from chainercv import utils


def get_ade20k(root, url):
    # To support ChainerMN, the target directory should be locked.
    with filelock.FileLock(os.path.join(download.get_dataset_directory(
            'pfnet/chainercv/.lock'), 'ade20k.lock')):
        data_root = download.get_dataset_directory(root)
        if os.path.exists(os.path.join(data_root, 'ADEChallengeData2016')):
            return data_root
        cache_path = utils.cached_download(url)
        utils.extractall(cache_path, data_root, os.path.splitext(url)[1])
    return data_root


ade20k_semantic_segmentation_label_names = (
    'wall',
    'edifice',
    'sky',
    'flooring',
    'tree',
    'ceiling',
    'route',
    'bed ',
    'window ',
    'grass',
    'cabinet',
    'pavement',
    'soul',
    'ground',
    'door',
    'table',
    'mount',
    'life',
    'pall',
    'chair',
    'motorcar',
    'water',
    'picture',
    'lounge',
    'shelf',
    'house',
    'sea',
    'mirror',
    'carpeting',
    'field',
    'armchair',
    'seat',
    'fencing',
    'desk',
    'stone',
    'press',
    'lamp',
    'tub',
    'rail',
    'cushion',
    'stand',
    'box',
    'pillar',
    'sign',
    'dresser',
    'counter',
    'sand',
    'sink',
    'skyscraper',
    'fireplace',
    'icebox',
    'stand',
    'path',
    'steps',
    'runway',
    'vitrine',
    'table',
    'pillow',
    'screen',
    'staircase',
    'river',
    'span',
    'bookcase',
    'screen',
    'table',
    'throne',
    'flower',
    'book',
    'hill',
    'bench',
    'countertop',
    'stove',
    'tree',
    'island',
    'system',
    'chair',
    'boat',
    'bar',
    'machine',
    'shanty',
    'vehicle',
    'towel',
    'source',
    'motortruck',
    'tower',
    'pendent',
    'sunblind',
    'lamp',
    'kiosk',
    'box',
    'plane',
    'track',
    'clothes',
    'pole',
    'soil',
    'handrail',
    'stairway',
    'hassock',
    'bottle',
    'sideboard',
    'card',
    'stage',
    'van',
    'ship',
    'fountain',
    'transporter',
    'canopy',
    'machine',
    'toy',
    'natatorium',
    'stool',
    'cask',
    'handbasket',
    'falls',
    'shelter',
    'bag',
    'motorbike',
    'cradle',
    'oven',
    'ball',
    'food',
    'stair',
    'tank',
    'marque',
    'oven',
    'flowerpot',
    'fauna',
    'cycle ',
    'lake',
    'machine',
    'screen',
    'cover',
    'sculpture',
    'hood',
    'sconce',
    'vase',
    'stoplight',
    'tray',
    'bin',
    'fan',
    'dock',
    'screen',
    'plate',
    'device',
    'board',
    'shower',
    'radiator',
    'glass',
    'clock',
    'flag'
)

ade20k_semantic_segmentation_label_colors = (
    (120, 120, 120),
    (180, 120, 120),
    (6, 230, 230),
    (80, 50, 50),
    (4, 200, 3),
    (120, 120, 80),
    (140, 140, 140),
    (204, 5, 255),
    (230, 230, 230),
    (4, 250, 7),
    (224, 5, 255),
    (235, 255, 7),
    (150, 5, 61),
    (120, 120, 70),
    (8, 255, 51),
    (255, 6, 82),
    (143, 255, 140),
    (204, 255, 4),
    (255, 51, 7),
    (204, 70, 3),
    (0, 102, 200),
    (61, 230, 250),
    (255, 6, 51),
    (11, 102, 255),
    (255, 7, 71),
    (255, 9, 224),
    (9, 7, 230),
    (220, 220, 220),
    (255, 9, 92),
    (112, 9, 255),
    (8, 255, 214),
    (7, 255, 224),
    (255, 184, 6),
    (10, 255, 71),
    (255, 41, 10),
    (7, 255, 255),
    (224, 255, 8),
    (102, 8, 255),
    (255, 61, 6),
    (255, 194, 7),
    (255, 122, 8),
    (0, 255, 20),
    (255, 8, 41),
    (255, 5, 153),
    (6, 51, 255),
    (235, 12, 255),
    (160, 150, 20),
    (0, 163, 255),
    (140, 140, 140),
    (250, 10, 15),
    (20, 255, 0),
    (31, 255, 0),
    (255, 31, 0),
    (255, 224, 0),
    (153, 255, 0),
    (0, 0, 255),
    (255, 71, 0),
    (0, 235, 255),
    (0, 173, 255),
    (31, 0, 255),
    (11, 200, 200),
    (255, 82, 0),
    (0, 255, 245),
    (0, 61, 255),
    (0, 255, 112),
    (0, 255, 133),
    (255, 0, 0),
    (255, 163, 0),
    (255, 102, 0),
    (194, 255, 0),
    (0, 143, 255),
    (51, 255, 0),
    (0, 82, 255),
    (0, 255, 41),
    (0, 255, 173),
    (10, 0, 255),
    (173, 255, 0),
    (0, 255, 153),
    (255, 92, 0),
    (255, 0, 255),
    (255, 0, 245),
    (255, 0, 102),
    (255, 173, 0),
    (255, 0, 20),
    (255, 184, 184),
    (0, 31, 255),
    (0, 255, 61),
    (0, 71, 255),
    (255, 0, 204),
    (0, 255, 194),
    (0, 255, 82),
    (0, 10, 255),
    (0, 112, 255),
    (51, 0, 255),
    (0, 194, 255),
    (0, 122, 255),
    (0, 255, 163),
    (255, 153, 0),
    (0, 255, 10),
    (255, 112, 0),
    (143, 255, 0),
    (82, 0, 255),
    (163, 255, 0),
    (255, 235, 0),
    (8, 184, 170),
    (133, 0, 255),
    (0, 255, 92),
    (184, 0, 255),
    (255, 0, 31),
    (0, 184, 255),
    (0, 214, 255),
    (255, 0, 112),
    (92, 255, 0),
    (0, 224, 255),
    (112, 224, 255),
    (70, 184, 160),
    (163, 0, 255),
    (153, 0, 255),
    (71, 255, 0),
    (255, 0, 163),
    (255, 204, 0),
    (255, 0, 143),
    (0, 255, 235),
    (133, 255, 0),
    (255, 0, 235),
    (245, 0, 255),
    (255, 0, 122),
    (255, 245, 0),
    (10, 190, 212),
    (214, 255, 0),
    (0, 204, 255),
    (20, 0, 255),
    (255, 255, 0),
    (0, 153, 255),
    (0, 41, 255),
    (0, 255, 204),
    (41, 0, 255),
    (41, 255, 0),
    (173, 0, 255),
    (0, 245, 255),
    (71, 0, 255),
    (122, 0, 255),
    (0, 255, 184),
    (0, 92, 255),
    (184, 255, 0),
    (0, 133, 255),
    (255, 214, 0),
    (25, 194, 194),
    (102, 255, 0),
    (92, 0, 255)
)
